import 'package:flutter/services.dart';

/**
 * Flutter通讯工具类
 * 
 * 负责处理Flutter和原生Android之间的双向通讯，包括：
 * 1. MethodChannel: 处理同步方法调用
 * 2. EventChannel: 处理异步事件流
 * 3. 用户数据管理: CRUD操作
 * 4. 系统信息获取: 设备信息、网络状态等
 * 
 * 使用方式：
 * ```dart
 * // 获取设备信息
 * String deviceInfo = await FlutterCommunication.getDeviceInfo();
 * 
 * // 获取用户列表
 * List<Map<String, dynamic>> users = await FlutterCommunication.getUsers();
 * 
 * // 添加用户
 * bool success = await FlutterCommunication.addUser({
 *   'name': 'John Doe',
 *   'email': 'john@example.com',
 *   'phone': '+1234567890'
 * });
 * 
 * // 监听原生事件
 * FlutterCommunication.nativeEvents.listen((event) {
 *   print('Received event: $event');
 * });
 * ```
 */
class FlutterCommunication {
  // MethodChannel用于调用原生方法
  static const MethodChannel _channel = MethodChannel('com.lqh.flutterModuleFirst/native_communication');
  
  // EventChannel用于接收原生事件
  static const EventChannel _eventChannel = EventChannel('com.lqh.flutterModuleFirst/events');

  /**
   * 调用原生方法
   * 
   * 通用的原生方法调用接口，处理所有与Android的通讯
   * 
   * @param methodName 方法名称
   * @param arguments 方法参数（可选）
   * @return 原生方法的返回值
   */
  static Future<dynamic> callNativeMethod(String methodName, [dynamic arguments]) async {
    try {
      final result = await _channel.invokeMethod(methodName, arguments);
      return result;
    } on PlatformException catch (e) {
      print('Error calling native method: ${e.message}');
      return null;
    } catch (e) {
      print('Unexpected error calling native method: $e');
      return null;
    }
  }

  // ==================== 用户管理相关方法 ====================

  /**
   * 获取用户列表
   * 
   * 从原生Android获取所有用户数据
   * 
   * @return 用户列表，每个用户包含id、name、email、phone、createdAt字段
   */
  static Future<List<Map<String, dynamic>>> getUsers() async {
    final result = await callNativeMethod('getUsers');
    if (result is List) {
      return result.cast<Map<String, dynamic>>();
    }
    return [];
  }

  /**
   * 添加用户
   * 
   * 向原生Android添加新用户
   * 
   * @param userData 用户数据，包含name、email、phone、createdAt字段
   * @return 添加是否成功
   */
  static Future<bool> addUser(Map<String, dynamic> userData) async {
    final result = await callNativeMethod('addUser', userData);
    return result == true;
  }

  /**
   * 根据ID获取用户
   * 
   * @param userId 用户ID
   * @return 用户信息，如果不存在则返回null
   */
  static Future<Map<String, dynamic>?> getUserById(int userId) async {
    final result = await callNativeMethod('getUserById', userId);
    if (result is Map) {
      return Map<String, dynamic>.from(result);
    }
    return null;
  }

  /**
   * 更新用户信息
   * 
   * @param userData 用户数据，必须包含id字段
   * @return 更新是否成功
   */
  static Future<bool> updateUser(Map<String, dynamic> userData) async {
    final result = await callNativeMethod('updateUser', userData);
    return result == true;
  }

  /**
   * 删除用户
   * 
   * @param userId 要删除的用户ID
   * @return 删除是否成功
   */
  static Future<bool> deleteUser(int userId) async {
    final result = await callNativeMethod('deleteUser', userId);
    return result == true;
  }

  // ==================== 系统信息相关方法 ====================

  /**
   * 获取设备信息
   * 
   * @return 设备信息字符串，包含Android版本和设备型号
   */
  static Future<String> getDeviceInfo() async {
    final result = await callNativeMethod('getDeviceInfo');
    return result ?? 'Unknown device';
  }

  /**
   * 获取系统信息
   * 
   * 包含设备信息、时间戳、平台信息等
   * 
   * @return 系统信息Map
   */
  static Future<Map<String, dynamic>> getSystemInfo() async {
    final deviceInfo = await getDeviceInfo();
    return {
      'deviceInfo': deviceInfo,
      'timestamp': DateTime.now().toIso8601String(),
      'platform': 'Android',
    };
  }

  /**
   * 获取应用版本信息
   * 
   * @return 应用版本号
   */
  static Future<String> getAppVersion() async {
    final result = await callNativeMethod('getAppVersion');
    return result ?? '1.0.0';
  }

  /**
   * 检查网络状态
   * 
   * @return 网络是否可用
   */
  static Future<bool> checkNetworkStatus() async {
    final result = await callNativeMethod('checkNetworkStatus');
    return result == true;
  }

  /**
   * 获取设备存储信息
   * 
   * @return 存储信息Map，包含totalSpace、freeSpace、usedSpace
   */
  static Future<Map<String, dynamic>> getStorageInfo() async {
    final result = await callNativeMethod('getStorageInfo');
    if (result is Map) {
      return Map<String, dynamic>.from(result);
    }
    return {
      'totalSpace': 'Unknown',
      'freeSpace': 'Unknown',
      'usedSpace': 'Unknown',
    };
  }

  // ==================== 事件通讯相关方法 ====================

  /**
   * 监听原生事件
   * 
   * 用于接收来自Android的事件通知，如数据更新等
   * 
   * @return 事件流Stream
   */
  static Stream<dynamic> get nativeEvents {
    try {
      return _eventChannel.receiveBroadcastStream();
    } catch (e) {
      print('Error setting up EventChannel listener: $e');
      // 返回一个空的流作为fallback
      return Stream.empty();
    }
  }

  /**
   * 发送数据到原生
   * 
   * 向Android发送数据，用于触发原生功能
   * 
   * @param data 要发送的数据字符串
   */
  static Future<void> sendDataToNative(String data) async {
    await callNativeMethod('sendDataFromFlutter', data);
  }

  /**
   * 显示原生Toast
   * 
   * 在Android端显示Toast消息
   * 
   * @param message 要显示的消息
   */
  static Future<void> showNativeToast(String message) async {
    await sendDataToNative('showToast:$message');
  }

  // ==================== 工具方法 ====================

  /**
   * 检查通讯是否可用
   * 
   * 通过调用简单的原生方法来测试通讯是否正常
   * 
   * @return 通讯是否可用
   */
  static Future<bool> isCommunicationAvailable() async {
    try {
      final result = await callNativeMethod('getDeviceInfo');
      return result != null;
    } catch (e) {
      return false;
    }
  }

  /**
   * 获取通讯状态信息
   * 
   * @return 通讯状态信息Map
   */
  static Future<Map<String, dynamic>> getCommunicationStatus() async {
    final isAvailable = await isCommunicationAvailable();
    final deviceInfo = await getDeviceInfo();
    
    return {
      'isAvailable': isAvailable,
      'deviceInfo': deviceInfo,
      'timestamp': DateTime.now().toIso8601String(),
    };
  }
} 